package com.system.manager.common.entity;

import com.system.manager.common.enums.ErrorCode;
import com.system.manager.common.enums.IErrorCode;
import com.system.manager.common.exception.SysException;
import lombok.Data;

/**
 * @Classname Result
 * @Description TODO 封装【返回的消息】
 * @Date 2021/10/17 11:25
 * @Created by 杨小鹏：【241960695@qq.com】
 */
@Data
public class Result<T> {

    private static final Integer SUCCESS_CODE = 0;
    private static final String SUCCESS_MSG = "操作成功";

    // 返回的消息状态码
    private Integer code;

    // 返回的消息
    private String message;

    // 返回的数据
    private T data;

    // 返回的count
    private Integer count;

    public Result(){
    }

    /**
     * 构造全参构造器
     * @param code
     * @param message
     * @param data
     */
    public Result(Integer code, String message, T data, Integer count){
        this.code = code;
        this.message = message;
        this.data = data;
        this.count = count;
    }
    /**
     * 构造全参构造器
     * @param code
     * @param message
     * @param data
     */
    public Result(Integer code, String message, T data){
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 构造部分参数构造器
     * @param code
     * @param message
     */
    public Result(Integer code, String message){
        this.code = code;
        this.message = message;
    }

    /**
     * 处理成功，并且不携带数据
     * @return
     */
    public static Result ok(){
        return new Result(SUCCESS_CODE, SUCCESS_MSG);
    }


    /**
     * 处理成功，携带数据
     * @return data
     */
    public static <E> Result<E> ok(E data){
        return new Result(SUCCESS_CODE, SUCCESS_MSG, data);
    }

    /**
     * 处理成功，携带数据和count
     * @return data
     */
    public static <E> Result<E> ok(E data, Integer count){
        return new Result<E>(SUCCESS_CODE, SUCCESS_MSG, data, count);
    }
    /**
     * 处理成功，携带自定义的状态码和消息
     * @return data
     */
    public static Result ok(Integer code, String message){
        return new Result(code, message);
    }


    /**
     * 处理失败,系统错误
     * @return
     */
    public static  Result error(){
        return new Result(ErrorCode.SYSTEM_FAILED.getCode(), ErrorCode.SYSTEM_FAILED.getMsg());
    }

    /**
     * 处理失败，返回失败信息
     * @param errorCode
     * @param <E>
     * @return
     */
    public static <E> Result<E> error(IErrorCode errorCode, E data){
        return new Result(errorCode.getCode(), errorCode.getMsg(), data);
    }

    /**
     * 处理失败，返回失败信息
     * @param errorCode
     * @return
     */
    public static Result error(IErrorCode errorCode){
        return new Result(errorCode.getCode(), errorCode.getMsg());
    }
    /**
     * 自定义状态的失败返回
     * @return
     */
    public static <E> Result<E> error(Integer code, String msg, E data) {
        return new Result(code, msg, data);
    }

    /**
     * 全局异常的返回值处理
     * @param exception
     * @return
     */
    public static Result error(SysException exception){
        return new Result(exception.getErrorCode(), exception.getErrorMsg());
    }
}
